package com.sunni.注解.案例;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class CalculatorCheck {

    /*
    * 执行本方法后，会自动检测Calculator类里所有方法(加了@check注解的)。判断方法是否有异常，如有异常则记录到一个文件中。*/

    public static void main(String[] args) throws IOException {
        // 1.拿到Calculator所有方法
        // 1.1 拿到Calculator类
        Calculator calculator = new Calculator();
        // 1.2 创建Calculator .class文件
        Class calculatorClass = calculator.getClass();
        // 1.3 获取Methods[]
        Method[] methods = calculatorClass.getMethods();

        int number = 0;
        BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));

        // 2. 遍历 检查所有方法
        for (Method method : methods) {
            // 2.1 判断 方法有木有@check注解
            if (method.isAnnotationPresent(Check.class)){
                // 2.2 有的话，执行方法
                try {
                    method.invoke(calculator);
                } catch (Exception e) {
                    // 2.3 记录异常
                    number++;

                    bw.write(method.getName()+"方法出现了异常");
                    bw.newLine();
                    bw.write("异常的名称 : "+e.getCause().getClass().getSimpleName());
                    bw.newLine();
                    bw.write("异常的原因 : "+e.getCause().getMessage());
                    bw.newLine();
                    bw.write("--------------------------------");
                    bw.newLine();
                }
            }

        }

        bw.write("本次测试一共出现了 "+number+" 次异常。");
        bw.flush();
        bw.close();
    }
}
